// 面向对象
// 1. 封装 :
// 2. 继承 :
// 3. 多态 : 一个方法多种表现形式
// 4. 抽象 : 抽象类 抽象方法


function Add() {

}

let a = new Add();
Add.prototype.count = 10;
Add.prototype.add = function () {
  // 函数式编程 : 以功能区分函数

  let arrParams = [...arguments];

  const noParams = () => { // 箭头函数 this指向 父级作用域
    return this.count;
  };


  const one = (params) => { // 箭头函数 this指向 父级作用域
    return this.count + params;
  };

  const two = (p1, p2) => { // 箭头函数 this指向 父级作用域
    return this.count + p1 + p2;
  };

  const three = (p1, p2, p3) => { // 箭头函数 this指向 父级作用域
    return p3 * p1 * p2;
  };
  const normal = (arr) => { // 箭头函数 this指向 父级作用域
    return arr.reduce((pre, next) => {
      return pre + next;
    }, 0);
  };
  const one1 = function () { // this指向 ? 函数的拥有者是谁 指向的就是谁 没有拥有者 指向的就是全局 global
    // this指向谁
    console.log(this);
    // return this.count;
  };

  switch (arrParams.length) {
    case 0:
      return noParams();
    case 1:
      return one(arrParams[0]);

    case 2:
      return two(arrParams[0], arrParams[1]);
    case 3:
      return three(arrParams[0], arrParams[1], arrParams[2]);
    default:
      return normal([...arrParams]);

  }
};

console.log(a.add());//没有参数 10
console.log(a.add(10));//20
console.log(a.add(1, 3, 3)); // 9 乘
console.log(a.add(1, 2, 3, 4, 5));// 15 相加
